{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 信用卡欺诈检测\n",
    "基于信用卡交易记录数据，建立分类模型来预测哪些交易记录是异常的，哪些是正常的。\n",
    "\n",
    "我整理好的数据地址：https://pan.baidu.com/s/18vPGelYCXGqp5OCWZWz36A 提取码：de0f\n",
    "\n",
    "kaggle数据地址：https://www.kaggle.com/mlg-ulb/creditcardfraud#creditcard.csv\n",
    "\n",
    "kesci数据地址：https://www.kesci.com/mw/dataset/5b56a592fc7e9000103c0442"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 任务目的：\n",
    "完成数据集中正常交易数据和异常交易数据的分类，并对测试数据进行预测 0/1进行分类。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 任务流程：\n",
    "* 加载数据，观测问题\n",
    "* 针对问题给出解决方案\n",
    "* 数据集划分\n",
    "* 评估方法对比\n",
    "* 逻辑回归模型\n",
    "* 建模结果分析\n",
    "* 方案效果对比\n",
    "\n",
    "### 主要解决问题：\n",
    "  (1) 在此项目中，我们首先对数据进行观测，发现了其中样本不均衡的问题，其实我们做任务工作之前都一定要先进行数据检查，看看数据有什么问题，针对这些问题来选择解决方案。\n",
    "  (2) 这里我们提出了两种方法，下采样和过采样，两条路线来进行对比实验，任何时间问题来了之后，我们都不会一条路走到黑，没有对比就没有优化，通常会得到一个基础模型，然后对各种方法进行对比，找到最合适的，然后在任务开始之前，一定得多想多准备，得到的结果才有可选择的余地。\n",
    "  (3) 在建模之前，需要对数据进行各种预处理操作，比如数据标准化，缺失值填充等，这些都是必要操作，由于数据本身已经给定了特征，此处我们还没有提到特征工程这个概念，后续实战中我们会逐步引入，其实数据预处理的工作是整个任务中最为重要也是最优难度的一个阶段，数据决定上限，模型逼近这个上限。\n",
    "  (4) 先选好评估方法，再进行建模。建模的目的是为了得到结果，但是我们不可能一次就得到最好的结果，肯定要尝试很多次，所以一定要有一个合适的评估方法，比如通用的AUC、ROC、召回率、精确率等，也可以根据实际问题自己指定评估指标。\n",
    "  (5) 选择合适的算法，这里我们使用的逻辑回归，逻辑回归现在使用的很少，但在金融领域还是一个非常具有代表的算法，其简单并具有可推导及解释性，深受金融行业的爱戴。\n",
    "  (6) 模型调参也是非常重要的，不用的调参会导致不同的结果，后续实战中我们也会有更多的调参细节，对于调参可以参考工具包的API文档，了解每个参数的意义，再来选择合适的参数值。\n",
    "  (7) 得到结果一定是和实际任务结合在一起，有时候线下（开发）时效果不错，但是上线后效果差距很大，所以测试环境也是必不可少的。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入工具包\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "# 把图轻松的镶嵌到这个notebook中\n",
    "%matplotlib inline\n",
    "\n",
    "import warnings  # 忽略普通警告，不打印太多东西\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Time</th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Amount</th>\n",
       "      <th>Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.359807</td>\n",
       "      <td>-0.072781</td>\n",
       "      <td>2.536347</td>\n",
       "      <td>1.378155</td>\n",
       "      <td>-0.338321</td>\n",
       "      <td>0.462388</td>\n",
       "      <td>0.239599</td>\n",
       "      <td>0.098698</td>\n",
       "      <td>0.363787</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.018307</td>\n",
       "      <td>0.277838</td>\n",
       "      <td>-0.110474</td>\n",
       "      <td>0.066928</td>\n",
       "      <td>0.128539</td>\n",
       "      <td>-0.189115</td>\n",
       "      <td>0.133558</td>\n",
       "      <td>-0.021053</td>\n",
       "      <td>149.62</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.191857</td>\n",
       "      <td>0.266151</td>\n",
       "      <td>0.166480</td>\n",
       "      <td>0.448154</td>\n",
       "      <td>0.060018</td>\n",
       "      <td>-0.082361</td>\n",
       "      <td>-0.078803</td>\n",
       "      <td>0.085102</td>\n",
       "      <td>-0.255425</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.225775</td>\n",
       "      <td>-0.638672</td>\n",
       "      <td>0.101288</td>\n",
       "      <td>-0.339846</td>\n",
       "      <td>0.167170</td>\n",
       "      <td>0.125895</td>\n",
       "      <td>-0.008983</td>\n",
       "      <td>0.014724</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-1.358354</td>\n",
       "      <td>-1.340163</td>\n",
       "      <td>1.773209</td>\n",
       "      <td>0.379780</td>\n",
       "      <td>-0.503198</td>\n",
       "      <td>1.800499</td>\n",
       "      <td>0.791461</td>\n",
       "      <td>0.247676</td>\n",
       "      <td>-1.514654</td>\n",
       "      <td>...</td>\n",
       "      <td>0.247998</td>\n",
       "      <td>0.771679</td>\n",
       "      <td>0.909412</td>\n",
       "      <td>-0.689281</td>\n",
       "      <td>-0.327642</td>\n",
       "      <td>-0.139097</td>\n",
       "      <td>-0.055353</td>\n",
       "      <td>-0.059752</td>\n",
       "      <td>378.66</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.966272</td>\n",
       "      <td>-0.185226</td>\n",
       "      <td>1.792993</td>\n",
       "      <td>-0.863291</td>\n",
       "      <td>-0.010309</td>\n",
       "      <td>1.247203</td>\n",
       "      <td>0.237609</td>\n",
       "      <td>0.377436</td>\n",
       "      <td>-1.387024</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.108300</td>\n",
       "      <td>0.005274</td>\n",
       "      <td>-0.190321</td>\n",
       "      <td>-1.175575</td>\n",
       "      <td>0.647376</td>\n",
       "      <td>-0.221929</td>\n",
       "      <td>0.062723</td>\n",
       "      <td>0.061458</td>\n",
       "      <td>123.50</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>-1.158233</td>\n",
       "      <td>0.877737</td>\n",
       "      <td>1.548718</td>\n",
       "      <td>0.403034</td>\n",
       "      <td>-0.407193</td>\n",
       "      <td>0.095921</td>\n",
       "      <td>0.592941</td>\n",
       "      <td>-0.270533</td>\n",
       "      <td>0.817739</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009431</td>\n",
       "      <td>0.798278</td>\n",
       "      <td>-0.137458</td>\n",
       "      <td>0.141267</td>\n",
       "      <td>-0.206010</td>\n",
       "      <td>0.502292</td>\n",
       "      <td>0.219422</td>\n",
       "      <td>0.215153</td>\n",
       "      <td>69.99</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Time        V1        V2        V3        V4        V5        V6        V7  \\\n",
       "0   0.0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   \n",
       "1   0.0  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   \n",
       "2   1.0 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   \n",
       "3   1.0 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   \n",
       "4   2.0 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   \n",
       "\n",
       "         V8        V9  ...       V21       V22       V23       V24       V25  \\\n",
       "0  0.098698  0.363787  ... -0.018307  0.277838 -0.110474  0.066928  0.128539   \n",
       "1  0.085102 -0.255425  ... -0.225775 -0.638672  0.101288 -0.339846  0.167170   \n",
       "2  0.247676 -1.514654  ...  0.247998  0.771679  0.909412 -0.689281 -0.327642   \n",
       "3  0.377436 -1.387024  ... -0.108300  0.005274 -0.190321 -1.175575  0.647376   \n",
       "4 -0.270533  0.817739  ... -0.009431  0.798278 -0.137458  0.141267 -0.206010   \n",
       "\n",
       "        V26       V27       V28  Amount  Class  \n",
       "0 -0.189115  0.133558 -0.021053  149.62      0  \n",
       "1  0.125895 -0.008983  0.014724    2.69      0  \n",
       "2 -0.139097 -0.055353 -0.059752  378.66      0  \n",
       "3 -0.221929  0.062723  0.061458  123.50      0  \n",
       "4  0.502292  0.219422  0.215153   69.99      0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "data = pd.read_csv(\"data/creditcard.csv\")\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据情况说明：\n",
    "数据集包含由欧洲人于2013年9月使用信用卡进行交易的数据。此数据集显示两天内发生的交易，其中284807笔交易中有492笔被盗刷。数据集非常不平衡，正例（被盗刷）占所有交易的0.172％。，这是因为由于保密问题，我们无法提供有关数据的原始功能和更多背景信息。特征V1，V2，... V28是使用PCA获得的主要组件，没有用PCA转换的唯一特征是“Class”和“Amount”。特征'Time'包含数据集中每个刷卡时间和第一次刷卡时间之间经过的秒数。特征'Class'是响应变量，如果发生被盗刷，则取值1，否则为0。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0    284315\n",
      "1       492\n",
      "Name: Class, dtype: int64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 数据标签分布\n",
    "count_classes = pd.value_counts(data['Class'], sort=True).sort_index()  # 统计里面不同分类的量\n",
    "count_classes.plot(kind='bar')  # 使用直方图\n",
    "plt.title(\"Fraund class histogram\")\n",
    "plt.xlabel(\"Class\")\n",
    "plt.ylabel(\"Frequency\")\n",
    "print(count_classes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "明显的正负样本数量有差异，正样本（为1）只有492个，负样本有28万个，这种情况下，如果直接给模型学习，那么模型很容易知道，只要它把样本预测为负，那么准确率就在99.99%以上。\n",
    "\n",
    "我们不能让模型学到这种歪门技巧。\n",
    "\n",
    "有两种方案解决：\n",
    "* 1和0一样多，也就是1也有28万个左右。（上采样）\n",
    "* 0和1一样少，也就是28万里只取492个。（下采样）\n",
    "\n",
    "两个方案的比较：\n",
    "* 第一种需要造一些数据，那么数据就是假的，假的会影响模型在预测真实数据时，结果自然会下降。\n",
    "* 第二种方式则会减少真实数据，使得模型可学的数据变少，能力也会减弱。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据标准化处理\n",
    "\n",
    "上面Amount列的值还是原值，相比其它列的值过大，会导致模型结果出现偏差，认为Amount列是非常重要的，具体可参考前面讲过的回归分析章节，需要对其标准化，大的值在区间内依然是大的，小的值在区间内依然是小的，可以理解为一种缩放。\n",
    "\n",
    "对逻辑回归来说，所有的训练数据都需要进行标准化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>V10</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Class</th>\n",
       "      <th>normAmount</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.359807</td>\n",
       "      <td>-0.072781</td>\n",
       "      <td>2.536347</td>\n",
       "      <td>1.378155</td>\n",
       "      <td>-0.338321</td>\n",
       "      <td>0.462388</td>\n",
       "      <td>0.239599</td>\n",
       "      <td>0.098698</td>\n",
       "      <td>0.363787</td>\n",
       "      <td>0.090794</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.018307</td>\n",
       "      <td>0.277838</td>\n",
       "      <td>-0.110474</td>\n",
       "      <td>0.066928</td>\n",
       "      <td>0.128539</td>\n",
       "      <td>-0.189115</td>\n",
       "      <td>0.133558</td>\n",
       "      <td>-0.021053</td>\n",
       "      <td>0</td>\n",
       "      <td>0.244964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.191857</td>\n",
       "      <td>0.266151</td>\n",
       "      <td>0.166480</td>\n",
       "      <td>0.448154</td>\n",
       "      <td>0.060018</td>\n",
       "      <td>-0.082361</td>\n",
       "      <td>-0.078803</td>\n",
       "      <td>0.085102</td>\n",
       "      <td>-0.255425</td>\n",
       "      <td>-0.166974</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.225775</td>\n",
       "      <td>-0.638672</td>\n",
       "      <td>0.101288</td>\n",
       "      <td>-0.339846</td>\n",
       "      <td>0.167170</td>\n",
       "      <td>0.125895</td>\n",
       "      <td>-0.008983</td>\n",
       "      <td>0.014724</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.342475</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.358354</td>\n",
       "      <td>-1.340163</td>\n",
       "      <td>1.773209</td>\n",
       "      <td>0.379780</td>\n",
       "      <td>-0.503198</td>\n",
       "      <td>1.800499</td>\n",
       "      <td>0.791461</td>\n",
       "      <td>0.247676</td>\n",
       "      <td>-1.514654</td>\n",
       "      <td>0.207643</td>\n",
       "      <td>...</td>\n",
       "      <td>0.247998</td>\n",
       "      <td>0.771679</td>\n",
       "      <td>0.909412</td>\n",
       "      <td>-0.689281</td>\n",
       "      <td>-0.327642</td>\n",
       "      <td>-0.139097</td>\n",
       "      <td>-0.055353</td>\n",
       "      <td>-0.059752</td>\n",
       "      <td>0</td>\n",
       "      <td>1.160686</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.966272</td>\n",
       "      <td>-0.185226</td>\n",
       "      <td>1.792993</td>\n",
       "      <td>-0.863291</td>\n",
       "      <td>-0.010309</td>\n",
       "      <td>1.247203</td>\n",
       "      <td>0.237609</td>\n",
       "      <td>0.377436</td>\n",
       "      <td>-1.387024</td>\n",
       "      <td>-0.054952</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.108300</td>\n",
       "      <td>0.005274</td>\n",
       "      <td>-0.190321</td>\n",
       "      <td>-1.175575</td>\n",
       "      <td>0.647376</td>\n",
       "      <td>-0.221929</td>\n",
       "      <td>0.062723</td>\n",
       "      <td>0.061458</td>\n",
       "      <td>0</td>\n",
       "      <td>0.140534</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.158233</td>\n",
       "      <td>0.877737</td>\n",
       "      <td>1.548718</td>\n",
       "      <td>0.403034</td>\n",
       "      <td>-0.407193</td>\n",
       "      <td>0.095921</td>\n",
       "      <td>0.592941</td>\n",
       "      <td>-0.270533</td>\n",
       "      <td>0.817739</td>\n",
       "      <td>0.753074</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009431</td>\n",
       "      <td>0.798278</td>\n",
       "      <td>-0.137458</td>\n",
       "      <td>0.141267</td>\n",
       "      <td>-0.206010</td>\n",
       "      <td>0.502292</td>\n",
       "      <td>0.219422</td>\n",
       "      <td>0.215153</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.073403</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 30 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         V1        V2        V3        V4        V5        V6        V7  \\\n",
       "0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   \n",
       "1  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   \n",
       "2 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   \n",
       "3 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   \n",
       "4 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   \n",
       "\n",
       "         V8        V9       V10  ...       V21       V22       V23       V24  \\\n",
       "0  0.098698  0.363787  0.090794  ... -0.018307  0.277838 -0.110474  0.066928   \n",
       "1  0.085102 -0.255425 -0.166974  ... -0.225775 -0.638672  0.101288 -0.339846   \n",
       "2  0.247676 -1.514654  0.207643  ...  0.247998  0.771679  0.909412 -0.689281   \n",
       "3  0.377436 -1.387024 -0.054952  ... -0.108300  0.005274 -0.190321 -1.175575   \n",
       "4 -0.270533  0.817739  0.753074  ... -0.009431  0.798278 -0.137458  0.141267   \n",
       "\n",
       "        V25       V26       V27       V28  Class  normAmount  \n",
       "0  0.128539 -0.189115  0.133558 -0.021053      0    0.244964  \n",
       "1  0.167170  0.125895 -0.008983  0.014724      0   -0.342475  \n",
       "2 -0.327642 -0.139097 -0.055353 -0.059752      0    1.160686  \n",
       "3  0.647376 -0.221929  0.062723  0.061458      0    0.140534  \n",
       "4 -0.206010  0.502292  0.219422  0.215153      0   -0.073403  \n",
       "\n",
       "[5 rows x 30 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# X = (x-μ)/σ,使得新的X数据集方差为1，均值为0\n",
    "# fit_transform(data['Amount']) 意思是找出data['Amount']的μ和σ，并应用在data['Amount']上。\n",
    "data['normAmount'] = StandardScaler().fit_transform(data['Amount'].values.reshape(-1,1))\n",
    "data = data.drop(['Time', 'Amount'], axis=1)  # Time这里用不上也去掉\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 下采样方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "正常样本所占整体比例： 0.5\n",
      "异常样本所占整体比例： 0.5\n",
      "下采样策略总体样本量： 984\n"
     ]
    }
   ],
   "source": [
    "X = data.loc[:,data.columns != \"Class\"]  # 特征\n",
    "y = data.loc[:,data.columns == \"Class\"]  # 标签\n",
    " \n",
    "# 得到正样本（异常样本）的索引\n",
    "number_records_fraud=len(data[data.Class==1])\n",
    "fraud_indices=np.array(data[data.Class==1].index)\n",
    "\n",
    "# 得到负样本（正常样本）的索引\n",
    "normal_indices=data[data.Class==0].index\n",
    " \n",
    "# 从正常样本中随机采样指定个数的样本，并取索引\n",
    "random_normal_indices=np.random.choice(normal_indices, number_records_fraud,replace=False) \n",
    "random_normal_indices=np.array(random_normal_indices)\n",
    "\n",
    "# 有了正常样本和异常样本的索引\n",
    "under_sample_indices=np.concatenate([fraud_indices,random_normal_indices])\n",
    "\n",
    "# 根据索引得到下采样的所有样本点\n",
    "under_sample_data=data.iloc[under_sample_indices,:]\n",
    "\n",
    "X_under_sample=under_sample_data.iloc[:,under_sample_data.columns != \"Class\"]\n",
    "Y_under_sample=under_sample_data.iloc[:,under_sample_data.columns == \"Class\"]\n",
    "\n",
    "print(\"正常样本所占整体比例：\", len(under_sample_data[under_sample_data.Class == 0])/len(under_sample_data))\n",
    "print(\"异常样本所占整体比例：\", len(under_sample_data[under_sample_data.Class == 1])/len(under_sample_data))\n",
    "print(\"下采样策略总体样本量：\", len(under_sample_data))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "原始训练集包含样本量： 199364\n",
      "原始测试集包含样本量： 85443\n",
      "原始样本总数： 284807\n",
      "\n",
      "\n",
      "下采样训练集包含样本数量:  688\n",
      "下采样测试集包含样本数量:  296\n",
      "下采样样本总数:  984\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split  # 切分数据集\n",
    "\n",
    "# 将数据切割成训练集0.7 和测试集 0.3\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)\n",
    "\n",
    "print(\"原始训练集包含样本量：\", len(X_train))\n",
    "print(\"原始测试集包含样本量：\", len(X_test))\n",
    "print(\"原始样本总数：\", len(X_train)+len(X_test))\n",
    "\n",
    "# 下采样数据集进行划分\n",
    "X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_under_sample\n",
    "                                                                                                   ,Y_under_sample\n",
    "                                                                                                   ,test_size = 0.3\n",
    "                                                                                                   ,random_state = 0)\n",
    " \n",
    "print(\"\\n\")\n",
    "print(\"下采样训练集包含样本数量: \", len(X_train_undersample))\n",
    "print(\"下采样测试集包含样本数量: \", len(X_test_undersample))\n",
    "print(\"下采样样本总数: \", len(X_train_undersample)+len(X_test_undersample))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型的评估方法——召回率\n",
    "由于目前正负样本极度不平衡，如果用准确率，那么和上面说的一样，模型把全部评定为正常样本，准确率就达到99.99%。这里用召回率，即异常样本找到多少个。\n",
    "\n",
    "Recall = TP/(TP+FN)\n",
    "\n",
    "* TP，即 True Positive =正确地判断成正例\n",
    "* TN，即 True negative=正确地判断成负例\n",
    "* FP，即False Positive =错误地判断成正例\n",
    "* FN ，即False negative =错误地判断成负例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 在sklearn库的线性模块中，调取“逻辑回归”\n",
    "from sklearn.linear_model import LogisticRegression  \n",
    "\n",
    "#交叉验证模块中，选用“K折交叉验证”\n",
    "#cross_val_score函数返回的是一个使用交叉验证以后的评分标准。\n",
    "from sklearn.model_selection import KFold, cross_val_score  \n",
    "\n",
    "# 混淆矩阵、召回率\n",
    "# sklearn中的classification_report函数用于显示主要分类指标的文本报告，在报告中显示每个类的精确度，召回率，F1值等信息。\n",
    "from sklearn.metrics import confusion_matrix,recall_score,classification_report \n",
    "\n",
    "# cross_val_predict 和 cross_val_score的使用方法是一样的，但是它返回的是一个使用交叉验证以后的输出值，而不是评分标准。\n",
    "from sklearn.model_selection import cross_val_predict"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 正则化惩罚——提高模型泛化能力\n",
    "模型过拟合通常出现在，数据量少的同时特征又多，也就是当下的情况，异常样本非常少，特征维度有28个。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 编写Kflod函数——printing_Kfold_scores，实际中我们可以直接调用\n",
    "def printing_Kfold_scores(x_train_data,y_train_data):\n",
    "    fold = KFold(5,shuffle=False)      #shuffle=False是指数据集不用洗牌\n",
    " \n",
    " # 定义不同力度的正则化惩罚力度，值越大惩罚力度越小\n",
    "    c_param_range = [0.01,0.1,1,10,100]\n",
    " # 展示结果用的表格\n",
    "    results_table = pd.DataFrame(index = range(len(c_param_range),2), columns = ['C_parameter','Mean recall score'])\n",
    "    results_table['C_parameter'] = c_param_range\n",
    " \n",
    " # k-fold 表示K折的交叉验证，这里会得到两个索引集合: 训练集 = indices[0], 验证集 = indices[1]\n",
    "    j = 0\n",
    " # 循环遍历不同的参数（这里的c_param_rang是5个——5折交叉验证）\n",
    "    for c_param in c_param_range:\n",
    "        print('-------------------------------------------')\n",
    "        print('正则化惩罚力度: ', c_param)\n",
    "        print('-------------------------------------------')\n",
    "        \n",
    "        # 计算每一次迭代后的召回率，一次5次\n",
    "        recall_accs = []\n",
    " \n",
    "         # 一步步分解来执行交叉验证\n",
    "        for iteration, indices in enumerate(fold.split(x_train_data)):\n",
    " \n",
    "            # 选择算法模型+给定参数\n",
    "            lr = LogisticRegression(C = c_param, penalty = 'l1')  #L1正则化防止过拟合，通过k折交叉验证寻找最佳的参数C。 \n",
    "\n",
    "            # 训练模型。注意索引不要给错了，训练的时候一定传入的是训练集，所以X和Y的索引都是0\n",
    "            lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())\n",
    "\n",
    "            # 使用验证集预测模型结果，这里用的就是验证集，索引为1\n",
    "            y_pred_undersample = lr.predict(x_train_data.iloc[indices[1],:].values)\n",
    "\n",
    "            # 评估模型。有了预测结果之后就可以来进行评估了，这里recall_score需要传入预测值和真实值。\n",
    "            recall_acc = recall_score(y_train_data.iloc[indices[1],:].values,y_pred_undersample)\n",
    "            # 保存每一步的结果，以便后续计算平均值。\n",
    "            recall_accs.append(recall_acc)\n",
    "            print('Iteration ', iteration,': 召回率 = ', recall_acc)\n",
    "\n",
    "        # 当执行完所有的交叉验证后，计算平均结果\n",
    "        results_table.loc[j,'Mean recall score'] = np.mean(recall_accs)\n",
    "        j += 1 # 在这儿的意思是 num = num + 1\n",
    "        print('')\n",
    "        print('平均召回率 ', np.mean(recall_accs))\n",
    "        print('')\n",
    "\n",
    "    # 找到最好的参数，哪一个Recall高，自然就是最好的了。\n",
    "    best_c = results_table.loc[results_table['Mean recall score'].astype('float32').idxmax()]['C_parameter']\n",
    "\n",
    "    # 打印最好的结果\n",
    "    print('***********************************')\n",
    "    print('效果最好的模型所选参数 = ', best_c)\n",
    "    print('***********************************')\n",
    "\n",
    "    return best_c"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "交叉验证与不同参数的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------------\n",
      "正则化惩罚力度:  0.01\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  0.9315068493150684\n",
      "Iteration  1 : 召回率 =  0.9178082191780822\n",
      "Iteration  2 : 召回率 =  1.0\n",
      "Iteration  3 : 召回率 =  0.972972972972973\n",
      "Iteration  4 : 召回率 =  0.9545454545454546\n",
      "\n",
      "平均召回率  0.9553666992023157\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  0.1\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  0.8493150684931506\n",
      "Iteration  1 : 召回率 =  0.863013698630137\n",
      "Iteration  2 : 召回率 =  0.9322033898305084\n",
      "Iteration  3 : 召回率 =  0.9459459459459459\n",
      "Iteration  4 : 召回率 =  0.9090909090909091\n",
      "\n",
      "平均召回率  0.8999138023981302\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  1\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  0.863013698630137\n",
      "Iteration  1 : 召回率 =  0.8904109589041096\n",
      "Iteration  2 : 召回率 =  0.9661016949152542\n",
      "Iteration  3 : 召回率 =  0.9459459459459459\n",
      "Iteration  4 : 召回率 =  0.8939393939393939\n",
      "\n",
      "平均召回率  0.9118823384669682\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  10\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  0.863013698630137\n",
      "Iteration  1 : 召回率 =  0.8767123287671232\n",
      "Iteration  2 : 召回率 =  0.9830508474576272\n",
      "Iteration  3 : 召回率 =  0.9459459459459459\n",
      "Iteration  4 : 召回率 =  0.9090909090909091\n",
      "\n",
      "平均召回率  0.9155627459783485\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  100\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  0.8767123287671232\n",
      "Iteration  1 : 召回率 =  0.8767123287671232\n",
      "Iteration  2 : 召回率 =  0.9830508474576272\n",
      "Iteration  3 : 召回率 =  0.9459459459459459\n",
      "Iteration  4 : 召回率 =  0.9393939393939394\n",
      "\n",
      "平均召回率  0.9243630780663519\n",
      "\n",
      "***********************************\n",
      "效果最好的模型所选参数 =  0.01\n",
      "***********************************\n"
     ]
    }
   ],
   "source": [
    "best_c = printing_Kfold_scores(X_train_undersample,y_train_undersample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 混淆矩阵\n",
    "def plot_confusion_matrix(cm, classes,\n",
    "                      title='Confusion matrix',\n",
    "                      cmap=plt.cm.Blues):\n",
    "    \"\"\"\n",
    "    绘制混淆矩阵\n",
    "    \"\"\"\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title)\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=0)\n",
    "    plt.yticks(tick_marks, classes)\n",
    "\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, cm[i, j],\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.ylabel('True label')\n",
    "    plt.xlabel('Predicted label')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "召回率:  0.9387755102040817\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAEmCAYAAADmw8JdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAeA0lEQVR4nO3debxVdb3/8df7cABFHEDUFFTU0ByuAyKZ5VCkQZJopWFozqQ5dLNujjmkFt1+jxzSNBzJ+ok0mOaQmldFuWoC4ZSKSA4oyqREoiLwuX+sdWiLcM5am73P2ovzfvZYD/Zee+3v97Ohx9vv+q5JEYGZmWXTVHQBZmZl4tA0M8vBoWlmloND08wsB4emmVkODk0zsxwcmh2MpDUl/UnSfEm/XYV2Rki6p5a1FUXSnpKeL7oOKwf5PM3GJOnrwKnAJ4AFwBTgooh4eBXbPRw4GdgjIhavcqENTlIA/SJiWtG12OrBI80GJOlU4BLgR8BGwGbAL4BhNWh+c2BqRwjMLCQ1F12DlUxEeGmgBVgX+BdwcCvbdCUJ1dfT5RKga/rZPsAM4LvALGAmcFT62fnAIuCDtI9jgPOAX1e03RcIoDl9fyQwnWS0+w9gRMX6hyu+twfwODA//XOPis8eAC4AJqTt3AP0Wslva6n/+xX1Hwh8EZgKzAPOrNh+IPAI8Ha67eVAl/Sz8elveSf9vV+raP804A3gxpZ16Xe2Svvon77fBJgD7FP0/ze8NMbikWbj+RSwBnBLK9ucBewO7AzsRBIcZ1d8/jGS8O1NEoxXSOoREeeSjF5vjojuEXFta4VIWgu4DBgSEWuTBOOUFWzXE7gj3XZ94GfAHZLWr9js68BRwIZAF+B7rXT9MZK/g97AOcDVwGHArsCewDmStky3XQJ8B+hF8nc3CPgWQETslW6zU/p7b65ovyfJqHtkZccR8SJJoP5GUjfgeuCGiHiglXqtA3FoNp71gTnR+u7zCOCHETErImaTjCAPr/j8g/TzDyLiTpJR1jZV1rMU2EHSmhExMyKeWcE2+wMvRMSNEbE4Im4CngO+VLHN9RExNSLeBcaRBP7KfEAyf/sBMJYkEC+NiAVp/88AOwJExKSIeDTt9yXgl8DeGX7TuRHxflrPh0TE1cALwGPAxiT/kTIDHJqNaC7Qq425tk2Alyvev5yuW9bGcqG7EOiet5CIeIdkl/Z4YKakOyR9IkM9LTX1rnj/Ro565kbEkvR1S6i9WfH5uy3fl7S1pNslvSHpnyQj6V6ttA0wOyLea2Obq4EdgJ9HxPttbGsdiEOz8TwCvEcyj7cyr5PsWrbYLF1XjXeAbhXvP1b5YUTcHRH7koy4niMJk7bqaanptSpryuNKkrr6RcQ6wJmA2vhOq6eMSOpOMk98LXBeOv1gBjg0G05EzCeZx7tC0oGSuknqLGmIpP9ON7sJOFvSBpJ6pdv/usoupwB7SdpM0rrAGS0fSNpI0gHp3Ob7JLv5S1bQxp3A1pK+LqlZ0teA7YDbq6wpj7WBfwL/SkfBJyz3+ZvAlh/5VusuBSZFxLEkc7VXrXKVttpwaDagiPgZyTmaZwOzgVeBk4A/pptcCEwEngSeAian66rp617g5rStSXw46JpIjsK/TnJEeW/SgyzLtTEXGJpuO5fkyPfQiJhTTU05fY/kINMCklHwzct9fh4wRtLbkg5pqzFJw4DBJFMSkPw79Jc0omYVW6n55HYzsxw80jQzy8GhaWaWg0PTzCwHh6aZWQ4NdbMCde4W6rpu0WVYDe249SZtb2Sl8eorLzN3zpy2zoPNrNM6m0cs/shFWSsV786+OyIG16r/ajRWaHZdl647Hll0GVZD9917QdElWA0N2vOTNW0vFr9L123aPBNsmfemXNHW1V5111ChaWYdjUDlmiV0aJpZcQSoZnv77cKhaWbF8kjTzCwrQVOnoovIxaFpZsXy7rmZWUbCu+dmZtnJI00zs1w80jQzy8EjTTOzrHxyu5lZdj653cwsJ480zcyy8u65mVl2Ajr5iiAzs+w8p2lmlpV3z83M8vFI08wsB480zcwykq89NzPLxyNNM7McPNI0M8vKR8/NzPLxSNPMLCPfud3MLA8/WM3MLB+PNM3McvCcpplZRirf0fNyVWtmq5+Wq4KyLG02peskzZL0dMW6n0p6TtKTkm6RtF7FZ2dImibpeUlfyFKuQ9PMCiUp85LBDcDg5dbdC+wQETsCU4Ez0n63A4YD26ff+YWkNo9KOTTNrDDJI4JqF5oRMR6Yt9y6eyJicfr2UaBP+noYMDYi3o+IfwDTgIFt9eHQNLPiKOcCvSRNrFhG5uzxaOCu9HVv4NWKz2ak61rlA0FmVqDMu90t5kTEgKp6ks4CFgO/Wdb5R0Vb7Tg0zaxQOUOz2j6OAIYCgyKiJRhnAJtWbNYHeL2ttrx7bmaFampqyrxUQ9Jg4DTggIhYWPHRbcBwSV0lbQH0A/7aVnseaZpZcf49V1mb5qSbgH1I5j5nAOeSHC3vCtybjmofjYjjI+IZSeOAv5Pstp8YEUva6sOhaWaFUf45zVZFxKErWH1tK9tfBFyUpw+HppkVqj3mNGvJoWlmhXJompnl4NA0M8uqxgeC2oND08wK5ZGmmVlGtT563h4cmmZWKIemmVlWAjU5NM3MMvNI08wsB4emmVlGPhBkZpZXuTLToWlmBZJ3zw246syvMOTTn2D2W/9iwGGXAnDOcfsydM9tWbo0mP32O4y88LfMnLOAoXtuyznH7cvSpcHiJUv5/qW3879PvlzwL7CVOeWEY7nnrjvptcGGPPz4lGXrr77ycq4ZfSXNnZrZd/AQzrtwVIFVlkvZQtM3Ia6DG++cxLDvXP+hdRf/ZjwDv3EZux/5c+6a8BxnHDUIgPsnvrhs/fE/+j2/OOPLRZRsGQ0fcQQ3//H2D6176MEHuOuOPzH+0clMmPgEJ55yakHVlVONn0ZZdw7NOpgw5SXm/XPhh9YtWPj+stfd1uhMyx3333l30bL1a63ZhWjzCSVWpD0+syc9evT80Lobrvkl3/7u9+natSsAG2y4YRGllVe+B6sVzrvn7ei8b+7HiMG7MP+d9xh80jXL1h+w13b88IQvsEGP7nz5e2MKrNCq8eK0qTwy4WEuOv8HdO26Buf/6Cf033W3ossqjUYZQWZV15GmpMGSnpc0TdLp9eyrDM775T30O+gnjL17Csd/5VPL1t82/u/sfOjFHHL6jZxz3L4FVmjVWLx4CfPffou775/A+ReN4thvfJ3wLkMmeXbNGyVc6xaakjoBVwBDgO2AQyVtV6/+ymTcvU9w4Ge3/8j6CVNeYsvePVl/3W4FVGXV2qR3b/Y/4CAk0X/AQJqampg7Z07RZZVGvR+sVmv1rGIgMC0ipkfEImAsMKyO/TW0rfqsv+z1/p/ZlqkvzwZgy97/Xr/z1pvQpXMn5s5f+JHvW+MaMvQAHnrwfgCmvTCVRYsWsX6vXgVXVSKe01ymN/BqxfsZwCeX30jSSGAkAF3WqWM57WfM+cPZc5ct6LXeWkz74+lccM1fGPypbei3eS+WLg1eeeNtTvnvPwJw0Ge35+uD+/PB4iW8t2gxh//gpoKrt9Ycd+RhTHjoQebNncN/bN2X0846hxHfOIpTTjiWz+y2M527dObyX17XMLuSZVC2vyvVa+5F0sHAFyLi2PT94cDAiDh5Zd9p6r5xdN3xyLrUY8WYce8FRZdgNTRoz08yZfKkmqVc14/1iz4jLsu8/fSffXFSRAyoVf/VqOdIcwawacX7PsDrdezPzEpGQMkGmnWd03wc6CdpC0ldgOHAbXXsz8xKp3xHz+s20oyIxZJOAu4GOgHXRcQz9erPzMqpQbIws7qe3B4RdwJ31rMPMyu3RhlBZuUrgsysOCrfSLMxzhY1sw5JQFOTMi9ttiddJ2mWpKcr1vWUdK+kF9I/e6TrJemy9IrFJyX1z1KzQ9PMClXL0ARuAAYvt+504L6I6Afcl76H5GrFfukyErgyU71ZNjIzq4t09zzr0paIGA/MW271MKDlTjhjgAMr1v8qEo8C60nauK0+PKdpZoVJztPMNanZS9LEivejI2J0G9/ZKCJmAkTETEkt9+5b0VWLvYGZrTXm0DSzAuU+/3JODa8IWlHHbV4i6d1zMytULXfPV+LNlt3u9M9Z6fqqrlp0aJpZodrhiqDbgCPS10cAt1as/0Z6FH13YH7LbnxrvHtuZsWp8Xmakm4C9iGZ+5wBnAuMAsZJOgZ4BTg43fxO4IvANGAhcFSWPhyaZlaYKg4EtSoiDl3JR4NWsG0AJ+btw6FpZoUq2xVBDk0zK5SvPTczy0pkvdKnYTg0zawwZbwJsUPTzArUODcXzsqhaWaFKllmOjTNrFgeaZqZZVXCmxA7NM2sMLU+ub09ODTNrFAOTTOzHEqWmQ5NMyuWR5pmZln5QJCZWXYi8wPTGoZD08wK1VSyoaZD08wKVbLMdGiaWXGSZ/+UKzUdmmZWqJJNaTo0zaxYq81IU9I6rX0xIv5Z+3LMrKMpWWa2OtJ8huTB6ZU/qeV9AJvVsS4z6wBEctpRmaw0NCNi05V9ZmZWK2Wb02zKspGk4ZLOTF/3kbRrfcsysw5ByZ3bsy6NoM3QlHQ58Fng8HTVQuCqehZlZh2DgE5Nyrw0gixHz/eIiP6S/gYQEfMkdalzXWbWQTTIADKzLKH5gaQmkoM/SFofWFrXqsysw2iU3e6sssxpXgH8HthA0vnAw8BP6lqVmXUIUr6lEbQ50oyIX0maBHw+XXVwRDxd37LMrKOo9Q07JH0HOJZk7/gp4ChgY2As0BOYDBweEYuqaT/T0XOgE/ABsCjHd8zM2qQcS5ttSb2BU4ABEbEDSXYNJ9k7vjgi+gFvAcdUW2+Wo+dnATcBmwB9gP8v6YxqOzQzq1SHU46agTUlNQPdgJnA54DfpZ+PAQ6stt4sB4IOA3aNiIUAki4CJgE/rrZTMzNIRo85zyTqJWlixfvRETG65U1EvCbp/wGvAO8C95Dk1dsRsTjdbAbQu9qas4Tmy8tt1wxMr7ZDM7Nl8p+0PiciBqy8OfUAhgFbAG8DvwWGrGDTyNNppdZu2HFx2vBC4BlJd6fv9yM5gm5mtspqfBzo88A/ImJ20rb+AOwBrCepOR1t9gFer7aD1kaaLUfInwHuqFj/aLWdmZlVarkiqIZeAXaX1I1k93wQMBG4H/gqyRH0I4Bbq+2gtRt2XFtto2ZmWdXy5PaIeEzS70hOK1oM/A0YTTLwGyvpwnRd1fnW5pympK2Ai4DtgDUqitu62k7NzFrU+pz1iDgXOHe51dOBgbVoP8s5lzcA15P8tiHAOJIhrpnZKpGSk9uzLo0gS2h2i4i7ASLixYg4m+SuR2Zmq2y1u4wSeF/JpMOLko4HXgM2rG9ZZtZRlO2GHVlC8ztAd5JLky4C1gWOrmdRZtZxlCwzM92w47H05QL+fSNiM7NVJhpnrjKr1k5uv4VWzpqPiC/XpSIz6zgaaK4yq9ZGmpe3WxWpXbbpzYTxvqR9ddJjt5OKLsFq6P3nX615m6vNnGZE3NeehZhZx1S2e01mORBkZlYXdbiMsu4cmmZWqJJlZvbQlNQ1It6vZzFm1rEkJ62XKzWz3Ll9oKSngBfS9ztJ+nndKzOzDqFJ2ZdGkGUO9jJgKDAXICKewJdRmlmNrI6XUTZFxMvLDaGX1KkeM+tAksddNEgaZpQlNF+VNBAISZ2Ak4Gp9S3LzDqK1fGUoxNIdtE3A94E/pKuMzNbZSUbaGa69nwWyXODzcxqSg10n8yssty5/WpWcA16RIysS0Vm1qGULDMz7Z7/peL1GsBBQO0vQDWzDkdAc6OcS5RRlt3zmyvfS7oRuLduFZlZh7I6jjSXtwWwea0LMbMOqIFOWs8qy5zmW/x7TrMJmAecXs+izKzjUM2fR1lfrYZm+mygnUieCwSwNCJWemNiM7M8kpPbi64in1bPK00D8paIWJIuDkwzq6nV8drzv0rqX/dKzKxDkpR5aQStPSOoOSIWA58BjpP0IvAOyYg6IsJBamarpIy7563Naf4V6A8c2E61mFlH00B3L8qqtdAUQES82E61mFkHVOvLKCWtB1wD7EBy5s/RwPPAzUBf4CXgkIh4q5r2WwvNDSSdurIPI+Jn1XRoZtYieUZQzZu9FPhzRHxVUhegG3AmcF9EjJJ0Oslpk6dV03hrodkJ6A4lO4nKzEpENNUwYiStA+wFHAkQEYuARZKGAfukm40BHqAOoTkzIn5YTaNmZlmIms9pbgnMBq6XtBMwCfg2sFFEzASIiJmSNqy2g9YGxh5hmll95ThHMz3K3kvSxIpl+butNZMcwL4yInYhOeOnplcwtjbSHFTLjszMViTngaA5ETGglc9nADMi4rH0/e9IQvNNSRuno8yNgVnVVdvKSDMi5lXbqJlZFi2757V6sFpEvEHyiJ5t0lWDgL8DtwFHpOuOAG6ttuZq7nJkZlYzdbhz+8nAb9Ij59OBo0gGiOMkHQO8AhxcbeMOTTMrVK0zMyKmACvaha/JlKND08wKI1bPp1GamdWHaJgbcWTl0DSzQpUrMh2aZlYgAZ080jQzy65kmenQNLMiNc7NhbNyaJpZYXz03MwsJ480zcxyKFdkOjTNrEg+T9PMLDvPaZqZ5eSRpplZDuWKTIemmRXIVwSZmeVUssx0aJpZkYRKtoPu0DSzQnmkaWaWUXLKUblS06FpZsXJ+MC0RuLQNLNCOTTNzHLwgSBbqcsvu5Trr7uaiOCoo4/j5G//Z9ElWQZXnTuCIXvtwOx5Cxhw8I8AOOdb+zN07x1ZGsHseQsYee6vmTl7Put0X4PrLjyCTTfuQXOnTlzyq/u48bZHC/4FjUtAU7kys3SXfZbWM08/zfXXXc1D//tX/jrpCe6683amvfBC0WVZBjf+6VGGnXjFh9ZdPOY+Bn7tx+w+fBR3PfQ0Z4wcAsA3D9mL56a/wSe/NoovHHcpo049iM7NnYoouzSU43+NwKHZTp577lkGDtydbt260dzczJ577c2tt95SdFmWwYTJLzJv/sIPrVvwznvLXndbsysRAUAA3dfqCsBaa3blrfkLWbxkabvVWkZNUualEXj3vJ1sv/0OnHfOWcydO5c111yTP991J/13XdHz7K0szjvxS4wYOpD5/3qXwSMvA+CqsQ/yu0u+yfR7LmLttdbg8NOuWxao9lHePa8g6TpJsyQ9Xa8+yuQT227Ld793GkMH78sB+w9mxx13ornZ/80qs/Ou+BP9hvyAsXdN5Piv7QXAvntsy5PPz2DL/c7ik8N/zMWnH8zaa61RcKWNLM/OeWOkaz13z28ABtex/dI58uhjeOTxyfzl/vH06NmTj3+8X9ElWQ2Mu+txDhy0MwCHH7A7t/7PEwBMf3UOL702l236blRkeY0tPU8z69II6haaETEemFev9sto1qxZALzyyivc+sc/cMjwQwuuyKq11WYbLHu9/947MvWlNwF49Y232GfgNgBs2HNttu67Ef94bU4hNZaFciyNoPD9Q0kjgZEAm262WcHV1Nehh3yFefPm0rm5M5dcdgU9evQouiTLYMyPj2TPXfvRa73uTPvzBVxw1Z0M/sz29Nt8Q5YuDV6ZOY9TLhoLwKir/8zo8w/j8XFnIsFZl97K3LffKfgXNK5kTrP2cSipEzAReC0ihkraAhgL9AQmA4dHxKKq2q7nJLWkvsDtEbFDlu133XVATHhsYt3qsfbXY7eTii7Bauj958exdOGsmqXctv+xS1x/y/2Zt/9Uvx6TIqLNI6iSTgUGAOukoTkO+ENEjJV0FfBERFxZTc0+5cjMilXj/XNJfYD9gWvS9wI+B/wu3WQMcGC15Ra+e25mHVvOo+K9JFXujo6OiNHLbXMJ8H1g7fT9+sDbEbE4fT8D6F1NrVDH0JR0E7APyY+cAZwbEdfWqz8zK6ecU5pzWts9lzQUmBURkyTt07J6BZtWPS9Zt9CMCB8aNrM21fgw0KeBAyR9EVgDWIdk5LmepOZ0tNkHeL3aDjynaWaFEckjfLMubYmIMyKiT0T0BYYD/xMRI4D7ga+mmx0B3FptzQ5NMytO+53cfhpwqqRpJHOcVU8V+kCQmRWqXietR8QDwAPp6+nAwFq069A0s2I1yqU+GTk0zaxAjXMjjqwcmmZWqEa5EUdWDk0zK0wj3YgjK4emmRWrZKnp0DSzQnlO08wsB89pmpll1UB3ZM/KoWlmhfLuuZlZRsm150VXkY9D08wKVbLMdGiaWcFKlpoOTTMrlOc0zcxy8JymmVkOJctMh6aZFaxkqenQNLPCJDfsKFdqOjTNrDiCpnJlpkPTzArm0DQzy8p3bjczy8WnHJmZZeQ7t5uZ5VWy1HRomlmhPKdpZpaD5zTNzHIoWWY6NM2sQCV83EVT0QWYWUenHEsbLUmbSrpf0rOSnpH07XR9T0n3Snoh/bNHtdU6NM2sMCK5jDLrksFi4LsRsS2wO3CipO2A04H7IqIfcF/6vioOTTMrlJR9aUtEzIyIyenrBcCzQG9gGDAm3WwMcGC19XpO08wKlfOUo16SJla8Hx0Ro1fYrtQX2AV4DNgoImZCEqySNqyuWoemmRUt34GgORExoM0mpe7A74H/jIh/qoZHm7x7bmaFqt1hoLQ9qTNJYP4mIv6Qrn5T0sbp5xsDs6qt16FpZoXJM5+ZZbCoZEh5LfBsRPys4qPbgCPS10cAt1Zbs3fPzaxQNb6M8tPA4cBTkqak684ERgHjJB0DvAIcXG0HDk0zK1YNMzMiHm6lxUG16MOhaWaFKtkFQQ5NMytW2S6jdGiaWWGEaCpZavrouZlZDh5pmlmhSjbQdGiaWbF853Yzs6xKeD9Nh6aZFcZPozQzy6tkqenQNLNCeU7TzCwHz2mameVQssx0aJpZsWp5g+D24NA0s8KI8u2eKyKKrmEZSbOBl4uuox30AuYUXYTVVEf5N908IjaoVWOS/kzyd5fVnIgYXKv+q9FQodlRSJqY5TknVh7+N+04fMMOM7McHJpmZjk4NIuxwuc0W6n537SD8JymmVkOHmmameXg0DQzy8Gh2Y4kDZb0vKRpkk4vuh5bdZKukzRL0tNF12Ltw6HZTiR1Aq4AhgDbAYdK2q7YqqwGbgAKPdna2pdDs/0MBKZFxPSIWASMBYYVXJOtoogYD8wrug5rPw7N9tMbeLXi/Yx0nZmViEOz/azotgQ+38usZBya7WcGsGnF+z7A6wXVYmZVcmi2n8eBfpK2kNQFGA7cVnBNZpaTQ7OdRMRi4CTgbuBZYFxEPFNsVbaqJN0EPAJsI2mGpGOKrsnqy5dRmpnl4JGmmVkODk0zsxwcmmZmOTg0zcxycGiameXg0FyNSFoiaYqkpyX9VlK3VWhrH0m3p68PaO2uTJLWk/StKvo4T9L3sq5fbpsbJH01R199fSciqwWH5url3YjYOSJ2ABYBx1d+qETuf/OIuC0iRrWyyXpA7tA0KyOH5urrIeDj6QjrWUm/ACYDm0raT9IjkianI9LusOx+n89Jehj4cktDko6UdHn6eiNJt0h6Il32AEYBW6Wj3J+m2/2XpMclPSnp/Iq2zkrvKfoXYJu2foSk49J2npD0++VGz5+X9JCkqZKGptt3kvTTir6/uap/kWaVHJqrIUnNJPftfCpdtQ3wq4jYBXgHOBv4fET0ByYCp0paA7ga+BKwJ/CxlTR/GfBgROwE9AeeAU4HXkxHuf8laT+gH8nt8HYGdpW0l6RdSS4f3YUklHfL8HP+EBG7pf09C1RecdMX2BvYH7gq/Q3HAPMjYre0/eMkbZGhH7NMmosuwGpqTUlT0tcPAdcCmwAvR8Sj6frdSW6CPEESQBeSywA/AfwjIl4AkPRrYOQK+vgc8A2AiFgCzJfUY7lt9kuXv6Xvu5OE6NrALRGxMO0jy7X3O0i6kGQKoDvJZagtxkXEUuAFSdPT37AfsGPFfOe6ad9TM/Rl1iaH5url3YjYuXJFGozvVK4C7o2IQ5fbbmdqd6s6AT+OiF8u18d/VtHHDcCBEfGEpCOBfSo+W76tSPs+OSIqwxVJfXP2a7ZC3j3veB4FPi3p4wCSuknaGngO2ELSVul2h67k+/cBJ6Tf7SRpHWABySiyxd3A0RVzpb0lbQiMBw6StKaktUmmAtqyNjBTUmdgxHKfHSypKa15S+D5tO8T0u2RtLWktTL0Y5aJR5odTETMTkdsN0nqmq4+OyKmShoJ3CFpDvAwsMMKmvg2MDq9m88S4ISIeETShPSUnrvSec1tgUfSke6/gMMiYrKkm4EpwMskUwht+QHwWLr9U3w4nJ8HHgQ2Ao6PiPckXUMy1zlZSeezgQOz/e2Ytc13OTIzy8G752ZmOTg0zcxycGiameXg0DQzy8GhaWaWg0PTzCwHh6aZWQ7/ByBecSY2agpvAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import itertools\n",
    "# 选择最优正则化参数\n",
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "# 训练模型\n",
    "lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "# 测试模型\n",
    "y_pred_undersample = lr.predict(X_test_undersample.values)\n",
    "# 计算所需值\n",
    "cnf_matrix = confusion_matrix(y_test_undersample,y_pred_undersample)\n",
    "np.set_printoptions(precision=2)\n",
    " \n",
    "print(\"召回率: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "# 绘制\n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "右上角19表示原本正常的，被判定为异常。右下角表示原本异常的，被判定为异常的。看似结果不错。\n",
    "\n",
    "但这里还不是我们的原始需求，我们的原始需求是在28万多个中，找到492个异常的。而目前是1：1的比例。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "召回率:  0.9183673469387755\n",
      "精确率:  0.011378961564396493\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVkAAAEmCAYAAADIhuPPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3de7wVVf3/8dcbEIW8gJqo4C09amSKYECZaZoIakHl3ZTMbySZ3S+aFl5Tq6+V176aJGSJZpGkKJFpZT9EQPGWF5BSjqCIIJF35PP7Y9bBDe6zzz6whzlnn/ezxzzOns+sWbM25Id11qxZo4jAzMzy0anoBpiZ1TMnWTOzHDnJmpnlyEnWzCxHTrJmZjlykjUzy5GTbAcjqZukP0paJum361DP8ZL+VMu2FUXSfpKeKLodVp/kebJtk6TjgK8DuwPLgdnABRFxzzrWewJwGvChiFixzg1t4yQF0BARc4tui3VM7sm2QZK+DvwU+AHQC9geuBIYXoPqdwCe7AgJthqSuhTdBqtzEeGtDW3AZsB/gSMrlNmQLAkvSNtPgQ3TsQOARuAbwCJgIXBSOnYO8AbwZrrGycDZwPUlde8IBNAl7X8WmEfWm/4XcHxJ/J6S8z4EzACWpZ8fKjl2N3Ae8I9Uz5+ALZv5bk3t/3ZJ+0cAhwJPAkuA75aUHwhMA15KZS8HuqZjf0vf5eX0fY8uqf87wHPAr5pi6Zyd0zX6p/1tgcXAAUX/f8Nb+9zck217PghsBEysUOZMYDDQD9iLLNGcVXJ8a7Jk3ZsskV4hqWdEjCHrHd8YERtHxLWVGiLpXcClwLCI2IQskc4uU25z4LZUdgvgEuA2SVuUFDsOOAnYCugKfLPCpbcm+zPoDXwfuAb4DDAA2A/4vqT3pLJvAV8DtiT7szsI+CJARHwkldkrfd8bS+rfnKxXP6r0whHxFFkC/rWk7sAvgesi4u4K7TVrlpNs27MFsDgq/zp/PHBuRCyKiBfIeqgnlBx/Mx1/MyImk/XidlvL9qwE9pDULSIWRsSjZcocBsyJiF9FxIqIuAF4HPh4SZlfRsSTEfEqcBPZPxDNeZNs/PlNYAJZAv1ZRCxP138U2BMgImZFxL3puv8G/g/Yv4rvNCYiXk/tWU1EXAPMAaYD25D9o2a2Vpxk254XgS1bGCvcFni6ZP/pFFtVxxpJ+hVg49Y2JCJeJvsV+xRgoaTbJO1eRXua2tS7ZP+5VrTnxYh4K31uSoLPlxx/tel8SbtKulXSc5L+Q9ZT37JC3QAvRMRrLZS5BtgDuCwiXm+hrFmznGTbnmnAa2TjkM1ZQParbpPtU2xtvAx0L9nfuvRgREyJiIPJenSPkyWfltrT1KZn17JNrXEVWbsaImJT4LuAWjin4pQaSRuTjXNfC5ydhkPM1oqTbBsTEcvIxiGvkDRCUndJG0gaJumHqdgNwFmS3i1py1T++rW85GzgI5K2l7QZcEbTAUm9JH0ijc2+Tjbs8FaZOiYDu0o6TlIXSUcDfYFb17JNrbEJ8B/gv6mXPXqN488D73nHWZX9DJgVEf9DNtb883VupXVYTrJtUERcQjZH9izgBWA+8CXgD6nI+cBM4CHgYeD+FFuba00Fbkx1zWL1xNiJbJbCArI77vuTbiqtUceLwOGp7ItkMwMOj4jFa9OmVvom2U215WS97BvXOH42ME7SS5KOaqkyScOBoWRDJJD9PfSXdHzNWmwdih9GMDPLkXuyZmY5cpI1M8uRk6yZWY6cZM3MctSmFsdQl26hrpsU3Qyrob4NfYpugtXQs/OfYemSxS3NQ65a5013iFjxjofumhWvvjAlIobW6vrrQ9tKsl03YcPdWpxlY+3IzZMvLroJVkNHDN2vpvXFildb9d/8a7OvaOlpvjanTSVZM+toBKrvUUsnWTMrjgDVbPShTXKSNbNiuSdrZpYXQafORTciV06yZlYsDxeYmeVEeLjAzCw/qvuebH3/E2JmbZ86Vb+1VJW0m6TZJdt/JH1V0uaSpkqak372TOUl6VJJcyU9JKl/SV0jU/k5kkaWxAdIejidc6lU+V8JJ1kzK5ZU/daCiHgiIvpFRD+yF2++QvZS0tOBOyOiAbgz7QMMAxrSNorsTRtNLwcdAwwie1HpmKbEnMqMKjmv4hNoTrJmViDVtCe7hoOApyLiaWA4MC7Fx/H2652GA+Mjcy/QQ9I2wCHA1IhYEhFLganA0HRs04iYFtli3OOp/Kooj8maWYFa/zDClpJmluxfHRFXN1P2GLJXNQH0ioiFABGxUNJWKd6b7M0jTRpTrFK8sUy8WU6yZlas1vVQF0fEPi1WKXUFPkHJO+uaK1omFmsRb5aHC8ysQLkNFwwD7o+IplfJP59+1Sf9XJTijcB2Jef1IXunXaV4nzLxZjnJmllxBHTuXP1WvWN5e6gAYBLQNENgJHBLSfzENMtgMLAsDStMAYZI6plueA0BpqRjyyUNTrMKTiypqywPF5hZsWo8T1ZSd+Bg4Asl4YuAmySdDDwDHJnik4FDgblkMxFOAoiIJZLOA2akcudGxJL0eTRwHdANuD1tzXKSNbMC1X6pw4h4BdhijdiLZLMN1iwbwKnN1DMWGFsmPhPYo9r2OMmaWbHq/IkvJ1kzK5bXLjAzy0mVT3K1Z06yZlYs92TNzHLknqyZWV78IkUzs3y5J2tmlhO/GcHMLE9+kaKZWb7ckzUzy5HHZM3MciLPLjAzy5d7smZm+WnhZa/tnpOsmRUme8WXk6yZWT5E+bdm1REnWTMrkNyTNTPLk5OsmVmOOnXyFC4zs3x4TNbMLD/ymKyZWb7qPcnW92CImbV5kqreqqyvh6SbJT0u6TFJH5S0uaSpkuaknz1TWUm6VNJcSQ9J6l9Sz8hUfo6kkSXxAZIeTudcqhYa5iRrZoWqdZIFfgbcERG7A3sBjwGnA3dGRANwZ9oHGAY0pG0UcFVq0+bAGGAQMBAY05SYU5lRJecNrdQYJ1kzK45aubVUnbQp8BHgWoCIeCMiXgKGA+NSsXHAiPR5ODA+MvcCPSRtAxwCTI2IJRGxFJgKDE3HNo2IaRERwPiSuspykjWzQrWyJ7ulpJkl26g1qnsP8ALwS0kPSPqFpHcBvSJiIUD6uVUq3xuYX3J+Y4pVijeWiTfLN77MrDBrMbtgcUTsU+F4F6A/cFpETJf0M94eGijfhHeKtYg3yz1ZMytUjcdkG4HGiJie9m8mS7rPp1/1ST8XlZTfruT8PsCCFuJ9ysSb5SRrZsURqJOq3loSEc8B8yXtlkIHAf8EJgFNMwRGArekz5OAE9Msg8HAsjScMAUYIqlnuuE1BJiSji2XNDjNKjixpK6yPFxgZoXKYZ7sacCvJXUF5gEnkXUob5J0MvAMcGQqOxk4FJgLvJLKEhFLJJ0HzEjlzo2IJenzaOA6oBtwe9qa5SRrZoWqdZKNiNlAuXHbg8qUDeDUZuoZC4wtE58J7FFte5xkzawwfqzWzCxv9Z1jnWTNrECq/7ULnGTXUsMOW/Griz+3an+n3ltw3lW3sXmPd3H4/nuyMoIXlixn1JjrWfjCMvYb0MBvfzKKfy94EYBb/jKbC6++A4DNNu7GVWOOo+/O2xABp5zza6Y/9C9+ddFJNOzYC4Aem3TjpeWvMviYi9b/l+0gzvzaaO7+8+1svuW7+eNd2f2OO/74ey7/3x8wb84T3DT5r+yxV/Zo+x9/fyNjr/zpqnOfeOwRfjflH+z4nl346hdOYP6/59Gpc2c+evChfOPMcwF4tvEZzvr6aJa8uJjNevTkh5ddy9bbVpzH3iE4yVpZc55etCrhdeoknppyAZPuepCl/3mVc6+8DYAvHrs/Z4waxpcvmADAPx54ik9/5efvqOvH3z6CP/2/f3Lct65lgy6d6b5RVwBOOP2Xq8pc9PVPsuy/r+b9tTq0EUcfz3EnfYHTv/L5VbGG3fty2S9+w5jvfHm1sh//1NF8/FNHA/DkY49w6knH8N499uTVV17hc6d8mUH77s8bb7zB5446jL/95U985MAh/Ojc7zL8iOMYcdTx3HvP3Vxy4Rh+eNkv1ut3bIvqPcl6nmwNfHTgbvyr8QWeWbiU5S+/tirevduGZDcvm7fJuzbiw/135rqJ0wB4c8VbZZPppw/uz013zKptw201Hxj8YXr07LlabOeG3dlpl10rnnfbH27msBFHANCte3cG7bs/AF27dqXv+/vx3MJnAZj75OMM/vABAAzad3/+MuW2Gn+DdqqGaxe0RU6yNXDkIQNWS4Bnn/px5tx+HscM24fzrnr7P6RBe+7E9BtP5w+Xj+a979kayIYZFi/9L1ef8xmm3fAdrvz+cat6sk327b8zzy9ZzlPPvLB+vpC1yu2TfsehI458R/w/y17irqm388GUWHfv+37+NPkPAEy9fRIv/3c5S5e8uD6b2iblsApXm5JrkpU0VNITad3FSs8Pt1sbdOnMYfu/n99PfWBV7Owr/kjDsO8x4faZnHL0RwCY/fh8djv0eww6+iKumvBXbvpJtq5Fly6d6bf7dlzz27/zwWMv5pVXX+ebnzt4tWscNXQffnvHzPX3paxqD94/g426dWPX3d+3WnzFihV884sn8ZmTR7PdDjsB8O3v/4AZ0+7hUwd/iJnT7qHXNtvSpUvHHrFrTYJ1kl2DpM7AFWTrNfYFjpXUN6/rFeWQD/dl9uPzWbRk+TuO3XT7DEYc1A+A5S+/xsuvvgHAlHv+yQZdOrNFj3fx7PNLeXbRS8x45GkAJv55Nv12f/uR6c6dOzH8wL24ecr96+HbWGtNvuVmDivTix3zrdPYYaedGfn5t+e5b7X1Nlx27Q38fur/4yunjwFgk003W29tbas6depU9dYe5dnqgcDciJgXEW8AE8jWbqwrRw3dZ7Whgp23f/eqz4ftvydP/vt5AHptscmq+D7v24FOEi++9DLPv7icxueW0rBDtvLaAQN34/F5z60qe+Cg3Xjy38/z7KKX8v4q1korV65kyq0TOXT4EavFf3rxOSxfvowzzv3havGlLy5m5cqVAFxz2Y/51NEnrLe2tml1Piab5+8q5dZjHLRmobQeZPa78wYb59ic2uu20QYcOGh3vnT+Dati5395OA07bMXKlcEzC5esmlnwyY/tzeeP3I8Vb73Fa6+9yYlnvD1z4OsX/5Zf/uCzdO3SmX8/u5hRY65fdWzN8V7LzzdGf5b7pv2dl5a8yAEDduVL3ziTzXr25IKzvsmSFxdzygmfZvf37ckvbsjWA5l57z302qb3quEAgOcWPMv//exHvGeXXfn0kH0BOO6kL3Dk8Vndl1x4NpLYZ9C+fP8HlxTyPdua9joMUC21dPd7rSuWjgQOiYj/SfsnAAMj4rTmzunUfavYcLejcmmPFeOByRcX3QSroSOG7scjD95fs6y44dYN0ef4S6suP++SQ2e1sJ5sm5NnT7a59RjNzIA0ClDfHdlcx2RnAA2SdkpLjh1DtnajmVlS/7MLcuvJRsQKSV8iW/y2MzA2Ih7N63pm1j6109xZtVwn6UXEZLJFcc3MymqvPdRqdeyZ0GZWLLkna2aWG5EtsFTPnGTNrFBOsmZmefFwgZlZfrJ5svWdZZ1kzaxA7Xf+a7WcZM2sUHWeY71ot5kVq9ZPfEn6t6SHJc2WNDPFNpc0VdKc9LNnikvSpWnN64ck9S+pZ2QqP0fSyJL4gFT/3HRuxYY5yZpZcdKNr2q3VvhoRPQrWUzmdODOiGgA7kz7kK133ZC2UcBVkCVlYAzZyoEDgTFNiTmVGVVy3tBKDXGSNbPCNN34Wg9rFwwHxqXP44ARJfHxkbkX6CFpG+AQYGpELImIpcBUYGg6tmlETItsCcPxJXWV5SRrZoVqZU92S0kzS7ZRZaoM4E+SZpUc7xURCwHSz61SvNy6171biDeWiTfLN77MrFCt7KEurmI92X0jYoGkrYCpkh6vdPkysViLeLPckzWz4ih74qvarRoRsSD9XARMJBtTfT79qk/6uSgVb27d60rxPmXizXKSNbPCNC3aXasbX5LeJWmTps/AEOARsrWsm2YIjARuSZ8nASemWQaDgWVpOGEKMERSz3TDawgwJR1bLmlwmlVwYkldZXm4wMwKVPOHEXoBE1OdXYDfRMQdkmYAN0k6GXgGaHrF8GTgUGAu8ApwEkBELJF0HtnLBwDOjYgl6fNo4DqgG3B72prlJGtmhapljo2IecBeZeIvAgeViQdw6prxdGwsMLZMfCawR7VtcpI1s0L5sVozs7x4FS4zs/x4FS4zs5w5yZqZ5ajOc6yTrJkVyz1ZM7O8+MaXmVl+RPWPy7ZXTrJmVqhOdd6VdZI1s0LVeY51kjWz4mQLv9R3lnWSNbNC1fmQrJOsmRWrw/ZkJW1a6cSI+E/tm2NmHU2d59iKPdlHeefrFpr2A9g+x3aZWQcgsmlc9azZJBsR2zV3zMysVup9TLaq189IOkbSd9PnPpIG5NssM+sQWvE68PY6dttikpV0OfBR4IQUegX4eZ6NMrOOQUDnTqp6a4+qmV3woYjoL+kBWPXum645t8vMOoh22kGtWjVJ9k1JnUjvFpe0BbAy11aZWYfRXocBqlXNmOwVwO+Ad0s6B7gHuDjXVplZh9Ca14G311zcYk82IsZLmgV8LIWOjIhH8m2WmXUUXiAm0xl4k2zIoKoZCWZm1ajvFFvd7IIzgRuAbYE+wG8knZF3w8ysY8hjCpekzpIekHRr2t9J0nRJcyTd2HTzXtKGaX9uOr5jSR1npPgTkg4piQ9NsbmSTm+pLdX0Sj8DfCAizoqIM4GBwIlVf1szs2aI7GGEardW+ArwWMn+xcBPIqIBWAqcnOInA0sjYhfgJ6kckvoCxwDvA4YCV6bE3ZnsPtUwoC9wbCrbrGqS7NOsPqzQBZhXxXlmZpXl8DCCpD7AYcAv0r6AA4GbU5FxwIj0eXjaJx0/KJUfDkyIiNcj4l/AXLIO5kBgbkTMi4g3gAmpbLMqLRDzE7Ix2FeARyVNSftDyGYYmJmts1be99pS0syS/asj4uo1yvwU+DawSdrfAngpIlak/Uagd/rcG5gPEBErJC1L5XsD95bUWXrO/DXigyo1uNKNr6YZBI8Ct5XE7y1T1sys1Zqe+GqFxRGxT7P1SYcDiyJilqQDSi6zpmjhWHPxcr/9R5nYKpUWiLm20olmZrVQ44cR9gU+IelQYCNgU7KebQ9JXVJvtg+wIJVvBLYDGiV1ATYDlpTEm5Se01y8rGpmF+wsaYKkhyQ92bS1dJ6ZWTXUiq0lEXFGRPSJiB3Jblz9JSKOB+4CjkjFRgK3pM+T0j7p+F8iIlL8mDT7YCegAbgPmAE0pNkKXdM1JlVqUzXzZK8Dzgd+THZH7ST8WK2Z1YC03h5G+A4wQdL5wANA02/q1wK/kjSXrAd7DEBEPCrpJuCfwArg1Ih4K2uzvgRMIXt+YGxEPFrpwtUk2e4RMUXSjyPiKeAsSX9v9Vc0MysjrxwbEXcDd6fP88hmBqxZ5jXgyGbOvwC4oEx8MjC52nZUk2RfT1ManpJ0CvAssFW1FzAzq6TeF4ipJsl+DdgY+DJZVt8M+FyejTKzjqPOc2xVC8RMTx+X8/bC3WZm60yo4y4QI2kiFeZ/RcSncmmRmXUc7XgJw2pV6slevt5akez93u35x/T1flkzq9KGXWq/CF+HHZONiDvXZ0PMrGOq97VTq11P1sys5tbisdp2x0nWzApV5zm2+iQracOIeD3PxphZx5K9u6u+s2w1axcMlPQwMCft7yXpstxbZmYdQk6LdrcZ1Yw5XwocDrwIEBEPAh/Ns1Fm1nF0+LfVAp0i4uk1uvRv5dQeM+tAstfPtNPsWaVqkux8SQOBSO+3OQ3wUodmVhOewgWjyYYMtgeeB/6cYmZm66zOO7JVrV2wiLTGoplZLUkdeO2CJpKuocwaBhExKpcWmVmHUuc5tqrhgj+XfN4I+CSrv63RzGytCOjSXudmVama4YIbS/cl/QqYmluLzKxDcU/2nXYCdqh1Q8ysA2rHDxlUq5ox2aW8PSbbiexlY6fn2Sgz6zhU1Xto26+KSTa922svsvd6AaxMr8s1M1tn2cMIRbciXxXnAaeEOjEi3kqbE6yZ1ZTXLoD7JPXPvSVm1iFJqnqroq6NJN0n6UFJj0o6J8V3kjRd0hxJN0rqmuIbpv256fiOJXWdkeJPSDqkJD40xeZKanHotNkkK6lpKOHDZIn2CUn3S3pA0v0tflszsxY0DRfUsCf7OnBgROwF9AOGShoMXAz8JCIagKXAyan8ycDSiNgF+Ekqh6S+ZA9hvQ8YClwpqXNaWuAKYBjQFzg2lW1WpTHZ+4D+wIiqvpqZWWvVeHWtNKT537S7QdoCOBA4LsXHAWcDVwHD02eAm4HL072o4cCEtIb2vyTNBQamcnMjYh6ApAmp7D+ba1OlJKvU6Keq/oZmZq1U68dqU29zFrALWa/zKeCliFiRijQCvdPn3qSHqyJihaRlwBYpfm9JtaXnzF8jPqhSeyol2XdL+npzByPikkoVm5m1JHvHV6tO2VLSzJL9qyPi6tICEfEW0E9SD2Ai8N4y9TTdxC+X4aNCvFxrK04IqJRkOwMbN3MxM7MaEJ1al2IWR8Q+1RSMiJck3Q0MBnpI6pJ6s32ABalYI7Ad0JjuQ21G9ixAU7xJ6TnNxcuqlGQXRsS51XwZM7O1IWo7Jivp3cCbKcF2Az5GdjPrLuAIYAIwErglnTIp7U9Lx/8SESFpEvAbSZcA2wINZPepBDRI2ons+YFjeHust6wWx2TNzHJT+/mv2wDj0rhsJ+CmiLhV0j+BCZLOBx4Ark3lrwV+lW5sLSEt6xoRj0q6ieyG1grg1DQMgaQvAVPIftsfGxGPVmpQpSR70Fp+STOzqtXyxldEPATsXSY+j7dnB5TGXwOObKauC4ALysQnA5OrbVOzSTYillRbiZnZ2qj1cEFbtDarcJmZ1UyHfzOCmVme6jzHOsmaWXGE31ZrZpYfUdXCL+2Zk6yZFaq+U6yTrJkVSEBn92TNzPJT5znWSdbMilTdYtztmZOsmRXGswvMzHLmnqyZWY7qO8U6yZpZkTxP1swsPx6TNTPLmXuyZmY5qu8U6yRrZgXyE19mZjmr8xzrJGtmRRKq8wEDJ1kzK5R7smZmOcmmcNV3lnWSNbPiyD1ZM7Nc1XuSrfeHLcysjVMr/tdiXdJ2ku6S9JikRyV9JcU3lzRV0pz0s2eKS9KlkuZKekhS/5K6RqbycySNLIkPkPRwOudStfA0hZNszr7wP59j+223YkC/PVbFzvjOt9hrj935wN57ctQRn+Sll14qsIXWknJ/h+eM+R4f2HtPBg3ox+HDhrBgwQIA/vbXu+m1xWYMGtCPQQP68YPzzy2q2e2CgE6qfqvCCuAbEfFeYDBwqqS+wOnAnRHRANyZ9gGGAQ1pGwVcBVlSBsYAg4CBwJimxJzKjCo5b2ilBjnJ5uyEkZ/lllvvWC120McOZtbsR5jxwEM0NOzKjy6+sKDWWTXK/R1+7RvfYsYDDzF91myGHXo4F5Yk030/vB/TZ81m+qzZfPes76/v5rY7tezJRsTCiLg/fV4OPAb0BoYD41KxccCI9Hk4MD4y9wI9JG0DHAJMjYglEbEUmAoMTcc2jYhpERHA+JK6ynKSzdmH9/sIm2+++Wqxjx08hC5dsuHwgYMG82xjYxFNsyqV+zvcdNNNV31+5ZWX6/75+zx1kqregC0lzSzZRjVXr6Qdgb2B6UCviFgIWSIGtkrFegPzS05rTLFK8cYy8Wb5xlfBxl83liOOPLroZthaGPO9M/n19ePZbLPNuGPqXavi0++dxsD+e7HNttty4cU/pu/73ldgK9u2puGCVlgcEfu0WK+0MfA74KsR8Z8K/wiWOxBrEW9Wbj1ZSWMlLZL0SF7XaO8uvvACOnfpwjHHHV90U2wtnHPeBcz913yOOfZ4fn7l5QD027s/Tzz1NPfd/yCjTz2No46o+JuktWqwoLpsLGkDsgT764j4fQo/n37VJ/1clOKNwHYlp/cBFrQQ71Mm3qw8hwuuo4UB4Y7s+vHjmHzbrVw3/tf+VbOdO+qY4/jDxN8B2TDCxhtvDMDQYYfy5ptvsnjx4iKb17alebLVbi1Wl/3HdC3wWERcUnJoEtA0Q2AkcEtJ/MQ0y2AwsCwNJ0wBhkjqmW54DQGmpGPLJQ1O1zqxpK6yckuyEfE3YEle9bdnf5pyB//744u5eeIkunfvXnRzbC3MnTNn1efb/jiJXXfbHYDnnnuO7H4IzLjvPlauXMkWW2xRSBvbC7Viq8K+wAnAgZJmp+1Q4CLgYElzgIPTPsBkYB4wF7gG+CJARCwBzgNmpO3cFAMYDfwinfMUcHulBhU+JpsGrkcBbLf99gW3pvZO/Myx/P2vd7N48WJ23rEP3/v+Ofzohxfy+uuvc/jQg4Hs5tdlV/684JZac8r9Hd5xx2TmPPkEndSJ7XfYgUuvyP7+Jv7uZq65+iq6dO7CRt26Mf76Cf5NpYJsTLZ2fz4RcQ/N5+ODypQP4NRm6hoLjC0Tnwns8c4zylPTv7p5SHf3bo2Iqho0YMA+8Y/pM3Nrj5mtm30H7cOsWTNrlhXf+/6945cT72q5YPLBhp6zqrnx1ZYU3pM1sw6uzjv6TrJmVqh6X082zylcNwDTgN0kNUo6Oa9rmVn7VcvZBW1Rbj3ZiDg2r7rNrH6009xZNQ8XmFlhhF8JbmaWn3Y8DFAtJ1kzK1Sd51gnWTMrWJ1nWSdZMyuQXwluZpYrj8mameWkFQu/tFtOsmZWrDrPsk6yZlYoj8mameXIY7JmZnnxwwhmZvnycIGZWU6ytQuKbkW+nGTNrFB1nmOdZM2sYHWeZZ1kzaxQHpM1M8uRx2TNzHJU5zk2v3d8mZlVRa3YWqpKGitpkaRHSmKbS5oqaU762TPFJelSSXMlPSSpf8k5I1P5OZJGlsQHSHo4nXOpqnitg5OsmRUmy53V/68K1wFD14idDtwZEQ3AnWkfYBjQkLZRwFWQJWVgDDAIGAiMaUrMqcyokvPWvNY7OMmaWXEEnVqxtSQi/gYsWSM8HBiXPo8DRpTEx0fmXqCHpG2AQ7bpTlIAAAY9SURBVICpEbEkIpYCU4Gh6dimETEtIgIYX1JXszwma2bFat2g7JaSZpbsXx0RV7dwTq+IWAgQEQslbZXivYH5JeUaU6xSvLFMvCInWTMrUKvfjLA4Ivap2cXfKdYiXpGHC8ysUFL121p6Pv2qT/q5KMUbge1KyvUBFrQQ71MmXpGTrJkVpjUTC9ZhqtckoGmGwEjglpL4iWmWwWBgWRpWmAIMkdQz3fAaAkxJx5ZLGpxmFZxYUlezPFxgZsWq4URZSTcAB5CN3TaSzRK4CLhJ0snAM8CRqfhk4FBgLvAKcBJARCyRdB4wI5U7NyKabqaNJpvB0A24PW0VOcmaWaFq+VhtRBzbzKGDypQN4NRm6hkLjC0Tnwns0Zo2OcmaWaH8WK2ZWY7qPMc6yZpZgfz6GTOzvNV3lnWSNbPCiOoel23PnGTNrFAeLjAzy5HfjGBmlqf6zrFOsmZWrDrPsU6yZlacdVz4pV1wkjWzQnlM1swsT/WdY51kzaxYdZ5jnWTNrFgekzUzy4kQneo8y/rNCGZmOXJP1swKVecdWSdZMyuWp3CZmeXFDyOYmeVnHd9C2y44yZpZseo8yzrJmlmhPCZrZpYjj8mameWoznOsk6yZFUt13pV1kjWzwoj6Hy5QRBTdhlUkvQA8XXQ71oMtgcVFN8JqqqP8ne4QEe+uVWWS7iD7s6vW4ogYWqvrrw9tKsl2FJJmRsQ+RbfDasd/p9YcLxBjZpYjJ1kzsxw5yRbj6qIbYDXnv1Mry2OyZmY5ck/WzCxHTrJmZjlykl2PJA2V9ISkuZJOL7o9tu4kjZW0SNIjRbfF2iYn2fVEUmfgCmAY0Bc4VlLfYltlNXAd0K4mx9v65SS7/gwE5kbEvIh4A5gADC+4TbaOIuJvwJKi22Ftl5Ps+tMbmF+y35hiZlbHnGTXn3LLYHj+nFmdc5JdfxqB7Ur2+wALCmqLma0nTrLrzwygQdJOkroCxwCTCm6TmeXMSXY9iYgVwJeAKcBjwE0R8WixrbJ1JekGYBqwm6RGSScX3SZrW/xYrZlZjtyTNTPLkZOsmVmOnGTNzHLkJGtmliMnWTOzHDnJ1hFJb0maLekRSb+V1H0d6jpA0q3p8ycqrRomqYekL67FNc6W9M1q42uUuU7SEa241o5eKcuK4CRbX16NiH4RsQfwBnBK6UFlWv13HhGTIuKiCkV6AK1OsmYdgZNs/fo7sEvqwT0m6UrgfmA7SUMkTZN0f+rxbgyr1rt9XNI9wKeaKpL0WUmXp8+9JE2U9GDaPgRcBOycetE/SuW+JWmGpIcknVNS15lpTd0/A7u19CUkfT7V86Ck363RO/+YpL9LelLS4al8Z0k/Krn2F9b1D9JsXTjJ1iFJXcjWrX04hXYDxkfE3sDLwFnAxyKiPzAT+LqkjYBrgI8D+wFbN1P9pcBfI2IvoD/wKHA68FTqRX9L0hCggWx5x37AAEkfkTSA7HHivcmS+Aeq+Dq/j4gPpOs9BpQ+UbUjsD9wGPDz9B1OBpZFxAdS/Z+XtFMV1zHLRZeiG2A11U3S7PT578C1wLbA0xFxb4oPJls0/B+SALqSPRa6O/CviJgDIOl6YFSZaxwInAgQEW8ByyT1XKPMkLQ9kPY3Jku6mwATI+KVdI1q1m7YQ9L5ZEMSG5M9ltzkpohYCcyRNC99hyHAniXjtZulaz9ZxbXMas5Jtr68GhH9SgMpkb5cGgKmRsSxa5TrR+2WXhRwYUT83xrX+OpaXOM6YEREPCjps8ABJcfWrCvStU+LiNJkjKQdW3lds5rwcEHHcy+wr6RdACR1l7Qr8Diwk6SdU7ljmzn/TmB0OrezpE2B5WS91CZTgM+VjPX2lrQV8Dfgk5K6SdqEbGiiJZsACyVtABy/xrEjJXVKbX4P8ES69uhUHkm7SnpXFdcxy4V7sh1MRLyQeoQ3SNowhc+KiCcljQJuk7QYuAfYo0wVXwGuTqtNvQWMjohpkv6RpkjdnsZl3wtMSz3p/wKfiYj7Jd0IzAaeJhvSaMn3gOmp/MOsnsyfAP4K9AJOiYjXJP2CbKz2fmUXfwEYUd2fjlnteRUuM7McebjAzCxHTrJmZjlykjUzy5GTrJlZjpxkzcxy5CRrZpYjJ1kzsxz9f5648g6tiqEqAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "# 代码和上面大致相同，唯一不同的，是这里我们使用的是真实比例\n",
    "y_pred = lr.predict(X_test.values)\n",
    " \n",
    "cnf_matrix = confusion_matrix(y_test,y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    " \n",
    "print(\"召回率: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "print(\"精确率: \", cnf_matrix[1,1]/(cnf_matrix[0,1]+cnf_matrix[1,1]))\n",
    " \n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一眼看到召回率92.8%貌似不错，但是右上角9433，表示有这么多正常的人被预测为异常，误判了这么多人。也就是精确率低的可怕"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 阈值对结果的影响\n",
    "模型会给出对每个样本的预测概率，默认是将0.5以上认为是被预测为异常的，那么如果我们将0.6以上才认定为异常呢？\n",
    "\n",
    "模型给的概率越高表示越肯定该样本是异常，那么我们可以算下不同阈值的概率，召回率和精确率分别是多少"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "指定的阈值为:  0.1 时，测试集的召回率: 1.00 精确率: 0.497\n",
      "指定的阈值为:  0.2 时，测试集的召回率: 1.00 精确率: 0.497\n",
      "指定的阈值为:  0.3 时，测试集的召回率: 1.00 精确率: 0.500\n",
      "指定的阈值为:  0.4 时，测试集的召回率: 0.97 精确率: 0.637\n",
      "指定的阈值为:  0.5 时，测试集的召回率: 0.94 精确率: 0.896\n",
      "指定的阈值为:  0.6 时，测试集的召回率: 0.89 精确率: 0.978\n",
      "指定的阈值为:  0.7 时，测试集的召回率: 0.82 精确率: 0.984\n",
      "指定的阈值为:  0.8 时，测试集的召回率: 0.77 精确率: 0.991\n",
      "指定的阈值为:  0.9 时，测试集的召回率: 0.60 精确率: 1.000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 18 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 还是那个模型和正则参数\n",
    "lr = LogisticRegression(C = best_c, penalty='l1')\n",
    "\n",
    "# 训练模型依然是下采样的数据集\n",
    "lr.fit(X_train_undersample, y_train_undersample.values.ravel())\n",
    "\n",
    "# 得到预测的概率\n",
    "y_pred_undersample_proba = np.array(lr.predict_proba(X_test_undersample.values))\n",
    "\n",
    "# 指定不同的阈值\n",
    "thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "j = 1\n",
    "\n",
    "# 用混淆矩阵来展示图形化结果\n",
    "for i in thresholds:\n",
    "    y_test_predictions_high_recall = y_pred_undersample_proba[:, 1] > i\n",
    "    \n",
    "    plt.subplot(3, 3, j)\n",
    "    j += 1\n",
    "    \n",
    "    cnf_matrix = confusion_matrix(y_test_undersample,y_test_predictions_high_recall)\n",
    "    np.set_printoptions(precision=2)\n",
    "\n",
    "    print(\"指定的阈值为: \",i,\"时，测试集的召回率:\", '{0:.2f}'.format(cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "         ,\"精确率:\", '{0:.3f}'.format(cnf_matrix[1,1]/(cnf_matrix[0,1]+cnf_matrix[1,1])))\n",
    "    \n",
    "    class_names = [0,1]\n",
    "    plot_confusion_matrix(cnf_matrix\n",
    "                          , classes=class_names\n",
    "                          , title='Confusion matrix')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "随着阈值的上升，召回率越来越低，但精确率越来越高，在不可改变的情况下，我们会选择合适的阈值进行业务使用。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### SMOTE过采样方案\n",
    "SMOTE方法是通过近邻构造数据，其中距离公式是欧式距离计算，在位置相近的点构造新数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from imblearn.over_sampling import SMOTE\n",
    "from sklearn.metrics import confusion_matrix"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "credit_cards = data.copy()\n",
    "columns = credit_cards.columns\n",
    "features_columns = columns.delete(len(columns)-1)\n",
    "\n",
    "features = credit_cards[features_columns]\n",
    "labels = credit_cards['Class']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "features_train, features_test, labels_train, labels_test = train_test_split(features, labels, \n",
    "                                                    test_size = 0.3, \n",
    "                                                    random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "基于SMOTE算法来进行样本生成，这样正负样本比例就是一致了"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "#初始化SMOTE 模型\n",
    "oversampler=SMOTE(random_state=0)\n",
    "\n",
    "#使用SMOTE模型，创造新的数据集\n",
    "os_features,os_labels=oversampler.fit_sample(features_train,labels_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "=====正负样本数据量=======\n",
      "0    199019\n",
      "1    199019\n",
      "dtype: int64\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Frequency')"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "os_count_classes = pd.value_counts(os_labels, sort = True).sort_index()\n",
    "print(\"=====正负样本数据量=======\")\n",
    "print(os_count_classes)\n",
    "\n",
    "os_count_classes.plot(kind = \"bar\")\n",
    "\n",
    "plt.title(\"Fraud class histogram\")\n",
    "plt.xlabel(\"Class\")\n",
    "plt.ylabel(\"Frequency\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此时数据量已完全一致，我们跑下模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------------------------------------\n",
      "正则化惩罚力度:  0.01\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  1.0\n",
      "Iteration  1 : 召回率 =  1.0\n",
      "Iteration  2 : 召回率 =  1.0\n",
      "Iteration  3 : 召回率 =  1.0\n",
      "Iteration  4 : 召回率 =  1.0\n",
      "\n",
      "平均召回率  1.0\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  0.1\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  1.0\n",
      "Iteration  1 : 召回率 =  1.0\n",
      "Iteration  2 : 召回率 =  1.0\n",
      "Iteration  3 : 召回率 =  1.0\n",
      "Iteration  4 : 召回率 =  1.0\n",
      "\n",
      "平均召回率  1.0\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  1\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  1.0\n",
      "Iteration  1 : 召回率 =  1.0\n",
      "Iteration  2 : 召回率 =  1.0\n",
      "Iteration  3 : 召回率 =  1.0\n",
      "Iteration  4 : 召回率 =  1.0\n",
      "\n",
      "平均召回率  1.0\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  10\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  1.0\n",
      "Iteration  1 : 召回率 =  1.0\n",
      "Iteration  2 : 召回率 =  1.0\n",
      "Iteration  3 : 召回率 =  1.0\n",
      "Iteration  4 : 召回率 =  1.0\n",
      "\n",
      "平均召回率  1.0\n",
      "\n",
      "-------------------------------------------\n",
      "正则化惩罚力度:  100\n",
      "-------------------------------------------\n",
      "Iteration  0 : 召回率 =  1.0\n",
      "Iteration  1 : 召回率 =  1.0\n",
      "Iteration  2 : 召回率 =  1.0\n",
      "Iteration  3 : 召回率 =  1.0\n",
      "Iteration  4 : 召回率 =  1.0\n",
      "\n",
      "平均召回率  1.0\n",
      "\n",
      "***********************************\n",
      "效果最好的模型所选参数 =  0.01\n",
      "***********************************\n"
     ]
    }
   ],
   "source": [
    "os_features = pd.DataFrame(os_features)\n",
    "os_labels = pd.DataFrame(os_labels)\n",
    "best_c = printing_Kfold_scores(os_features,os_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "召回率:  1.0\n",
      "精确率:  0.9735099337748344\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "lr = LogisticRegression(C = best_c, penalty = 'l1')\n",
    "lr.fit(os_features,os_labels.values.ravel())\n",
    "# 代码和上面大致相同，唯一不同的，是这里我们使用的是真实比例\n",
    "y_pred = lr.predict(features_test.values)\n",
    " \n",
    "cnf_matrix = confusion_matrix(labels_test,y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    " \n",
    "print(\"召回率: \", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "print(\"精确率: \", cnf_matrix[1,1]/(cnf_matrix[0,1]+cnf_matrix[1,1]))\n",
    " \n",
    "class_names = [0,1]\n",
    "plt.figure()\n",
    "plot_confusion_matrix(cnf_matrix\n",
    "                      , classes=class_names\n",
    "                      , title='Confusion matrix')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结果可以说是非常好，我们再试下不同阈值的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "指定的阈值为:  0.1 时，测试集的召回率: 1.00 精确率: 0.936\n",
      "指定的阈值为:  0.2 时，测试集的召回率: 1.00 精确率: 0.955\n",
      "指定的阈值为:  0.3 时，测试集的召回率: 1.00 精确率: 0.961\n",
      "指定的阈值为:  0.4 时，测试集的召回率: 1.00 精确率: 0.967\n",
      "指定的阈值为:  0.5 时，测试集的召回率: 1.00 精确率: 0.987\n",
      "指定的阈值为:  0.6 时，测试集的召回率: 1.00 精确率: 0.993\n",
      "指定的阈值为:  0.7 时，测试集的召回率: 1.00 精确率: 1.000\n",
      "指定的阈值为:  0.8 时，测试集的召回率: 1.00 精确率: 1.000\n",
      "指定的阈值为:  0.9 时，测试集的召回率: 1.00 精确率: 1.000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 18 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 试下不同阈值的结果\n",
    "lr = LogisticRegression(C = best_c, penalty='l1')\n",
    "\n",
    "lr.fit(os_features, os_labels.values.ravel())\n",
    "y_pred_over_proba = np.array(lr.predict_proba(features_test.values))\n",
    "\n",
    "\n",
    "thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]\n",
    "plt.figure(figsize=(8,8))\n",
    "j = 1\n",
    "\n",
    "# 用混淆矩阵来展示图形化结果\n",
    "for i in thresholds:\n",
    "    y_test_predictions_high_recall = y_pred_over_proba[:, 1] > i\n",
    "    \n",
    "    plt.subplot(3, 3, j)\n",
    "    j += 1\n",
    "    \n",
    "    cnf_matrix = confusion_matrix(labels_test,y_test_predictions_high_recall)\n",
    "    np.set_printoptions(precision=2)\n",
    "\n",
    "    print(\"指定的阈值为: \",i,\"时，测试集的召回率:\", '{0:.2f}'.format(cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))\n",
    "         ,\"精确率:\", '{0:.3f}'.format(cnf_matrix[1,1]/(cnf_matrix[0,1]+cnf_matrix[1,1])))\n",
    "    \n",
    "    class_names = [0,1]\n",
    "    plot_confusion_matrix(cnf_matrix\n",
    "                          , classes=class_names\n",
    "                          , title='Confusion matrix')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "此时当阈值越高，召回率没影响而精确率提升，我们可以选择更高的阈值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 项目总结\n",
    "    (1) 在项目中，我们发现了样本不均衡问题，并指定了相应的解决方案。\n",
    "    (2) 这里提出的两种方法，下采样和过采样，通过实验比对，找到合适的那个。\n",
    "    (3) 在建模时，我们使用各种预处理方法，如这里的数据标准化，甚至还有缺失值填充等。\n",
    "    (4) 选择合适的评估方法，再进行建模。建模得到我们预期的结果，并根据评估方法来评价模型。\n",
    "    (5) 这里选择的算法是逻辑回归，逻辑回归也是简单模型的代表，在工业界也常被使用。\n",
    "    (6) 模型训练后进行适当的调优也是非常必要的，如前面的下采样时。最终选择最优的参数。\n",
    "    (7) 得到的结果和实际任务结合，并确保效果偏差小。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
